package ru.inse.core.dao;

import java.util.List;


/**
 * Интерфейс для DAO (Data Access Object)
 *
 * @param <K> ключ
 * @param <E> сущность
 */
public interface IDao<E>
{
    /**
     * Ищет сущность по ID
     *
     * @param id
     * @return
     * @throws DaoException -  должен выкидывать исключение если сущность по указанному ID не найдена
     */
    E getById(Long id)
        throws DaoException;

    /**
     * Удаляет сущность по ее ID
     * @param entity
     * @throws DaoException - должен выкидывать исключение если указаной сущности не существует в базе
     */
    void remove(Long id)
        throws DaoException;

    /**
     * !!!Удаляет все сущности
     *
     * @return
     */
    int removeAll();

    /**
     * Обновляет сущность
     * @param entity
     */
    void save(E entity) throws DaoException;
    
    void persist(E entity) throws DaoException;

    /**
     * Возвращает все сущности
     * @return
     */
    List<E> getAll();

    /**
     * Возвращает количеств осущностей
     *
     * @return
     */
    Long count();
    
    /**
     * Возвращает количество сущностей
     * @param appender
     * @return
     */
    Long count(final ICriteriaAppender appender);

}
